#ifndef CLICKEDLABEL_H
#define CLICKEDLABEL_H

#include "global.h"
#include <QLabel>

/*
 *
 * 事件！=信号，但是信号之间可以连接，可以这么解释：1.信号可以连接  2.事件触发--->信号1发出(信号1发出事件触发)----->信号2
 * 1.事件可以传递  2.事件对应的多信号性
 * 3.信号可以传递  4.信号的回调函数可以是多个、
 * 5.回调函数可以抽象成状态切换的事件触发逻辑（事件），从而抽象表示事件触发导致状态转移，由于事件可能会导致多个状态的转移，所以是一种抽象
*/


//在QLabel的基础上扩展新的label
// 处理鼠标点击事件
//按钮有2种事件状态，选中和为选中
//鼠标点击：可以在选中和非选中之间切换，但是动画只有选中覆盖状态和非选中覆盖状态
//鼠标移除：选中非非覆盖状态，非选中覆盖状态
//鼠标进入：选中覆盖状态，非选中覆盖状态
//总体上：事件状态：选中和非选中
//动画上：选中覆盖状态，选中非覆盖状态，非选中覆盖状态，非选中非覆盖状态，四种动画状态机

//所以实体按钮状态只有选中和非选中，但是由于动画多样性，可以组合出四种动画状态机
//状态机问题：label状态之哟选中和未选中
//但是对应动画，却由于多种情况被化成6种动画状态，其中只有四种是有效的动画状态，所以其中的Qstring成员变量，其实是记录该按钮有几种
//动画状态，待会可以直接使用，他们是不会做修改的，而是作为当前label的动画状态的标签存在
//待会涉及到动画状态修改的时候，直接赋值过去就可以了，在我看来，可能把他们作为"enum"更合适一点，毕竟他们不会变



//通用的，可以变换的label
//考虑标识状态：选中和非选中
//考虑：未覆盖，覆盖，点击
//提前写死一种label，可以实现转换
//1.外界，设置好动画状态
//2.将动画状态通过set设置到对应的动画状态就可以了
//3.没有就不设置了
//4.完全解耦合
class ClickedLabel : public QLabel
{
    Q_OBJECT
public:
    ClickedLabel(QWidget* parent);

    //鼠标点击事件
    virtual void mousePressEvent(QMouseEvent *ev) override;     //忘记密码有
    //进入事件
    virtual void enterEvent(QEnterEvent *event) override;       //忘记密码有
    //离开事件
    virtual void leaveEvent(QEvent* event) override;            //忘记密码有

    //设置状态
    void SetState(QString normal="", QString hover="", QString press="",QString select="", QString select_hover="", QString select_press="");

    ClickLbState GetCurState();
protected:

private:
    QString _normal;            //没有选中，普通状态    同时也被忘记密码
    QString _normal_hover;      //没有选中但是覆盖      忘记密码也有
    QString _normal_press;      //没有选中，但是点击     忘记密码有

    QString _selected;          //选中，普通状态       忘记密码没有，可以设置成有
    QString _selected_hover;    //选中，覆盖状态       忘记密码没有，可以设置成有
    QString _selected_press;    //选中，点击状态       忘记密码没有，可以设置成有

    //是否是选中的状态
    ClickLbState _curstate;                         //忘记密码没有
signals:
    //发送的信号，因为要通知把对应的edit遮住，不让显示，或者开启，让显示
    void clicked(void);                             //忘记密码有
};


//忘记密码:为了不修改已有的代码，我们依然假设有两种点击状态，选中与未选中
//但是动画状态只有：覆盖和没有覆盖
//其中，选中覆盖和为选中覆盖--同样的动画效果
//选中不覆盖和为未选中不覆盖---同样的动画效果
//我不想修改任何内容，所以，鼠标点击的时候:未选中状态，覆盖的动画，会转换成选中，覆盖的动画，同样的动画
//所以我设置几种动画状态，才能保证不会修改代码，除非继承，然后进行重写，也是可以的

#endif // CLICKEDLABEL_H
